home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1419 / 1419.xpi / components / nsIeTabWatchFactory.js next >
Text File  |  2007-04-11  |  8KB  |  210 lines

  1. /*
  2.  * Copyright (c) 2005 yuoo2k <yuoo2k@gmail.com>
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2.1 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19.  
  20. const _IETABWATCH_CID = Components.ID('{3fdaa104-5988-4050-94fc-c711d568fe64}');
  21. const _IETABWATCH_CONTRACTID = "@mozilla.org/ietabwatch;1";
  22. const gIeTabChromeStr = "chrome://ietab/content/reloaded.html?url=";
  23.  
  24. // IeTabWatcher object
  25. var IeTabWatcher = {
  26.    isIeTabURL: function(url) {
  27.       if (!url) return false;
  28.       return (url.indexOf(gIeTabChromeStr) == 0);
  29.    },
  30.  
  31.    getIeTabURL: function(url) {
  32.       if (this.isIeTabURL(url)) return url;
  33.       if (/^file:\/\/.*/.test(url)) try { url = decodeURI(url).substring(8).replace(/\//g, "\\"); }catch(e){}
  34.       return gIeTabChromeStr + encodeURI(url);
  35.    },
  36.  
  37.    getBoolPref: function(prefName, defval) {
  38.       var result = defval;
  39.       var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  40.       var prefs = prefservice.getBranch("");
  41.       if (prefs.getPrefType(prefName) == prefs.PREF_BOOL) {
  42.           try { result = prefs.getBoolPref(prefName); }catch(e){}
  43.       }
  44.       return(result);
  45.    },
  46.  
  47.    getStrPref: function(prefName, defval) {
  48.       var result = defval;
  49.       var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  50.       var prefs = prefservice.getBranch("");
  51.       if (prefs.getPrefType(prefName) == prefs.PREF_STRING) {
  52.           try { result = prefs.getComplexValue(prefName, Components.interfaces.nsISupportsString).data; }catch(e){}
  53.       }
  54.       return(result);
  55.    },
  56.  
  57.    setStrPref: function(prefName, value) {
  58.       var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  59.       var prefs = prefservice.getBranch("");
  60.       var sString = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  61.       sString.data = value;
  62.       try { prefs.setComplexValue(prefName, Components.interfaces.nsISupportsString, sString); } catch(e){}
  63.    },
  64.  
  65.    isFilterEnabled: function() {
  66.       return (this.getBoolPref("ietab.filter", true));
  67.    },
  68.  
  69.    getPrefFilterList: function() {
  70.       var s = this.getStrPref("ietab.filterlist", null);
  71.       return (s ? s.split(" ") : "");
  72.    },
  73.  
  74.    setPrefFilterList: function(list) {
  75.       this.setStrPref("ietab.filterlist", list.join(" "));
  76.    },
  77.  
  78.    isMatchURL: function(url, pattern) {
  79.       if ((!pattern) || (pattern.length==0)) return false;
  80.       var retest = /^\/(.*)\/$/.exec(pattern);
  81.       if (retest) {
  82.          pattern = retest[1];
  83.       } else {
  84.          pattern = pattern.replace(/\\/g, "/");
  85.          var m = pattern.match(/^(.+:\/\/+[^\/]+\/)?(.*)/);
  86.          m[1] = (m[1] ? m[1].replace(/\./g, "\\.").replace(/\?/g, "[^\\/]?").replace(/\*/g, "[^\\/]*") : "");
  87.          m[2] = (m[2] ? m[2].replace(/\./g, "\\.").replace(/\+/g, "\\+").replace(/\?/g, "\\?").replace(/\*/g, ".*") : "");
  88.          pattern = m[1] + m[2];
  89.          pattern = "^" + pattern.replace(/\/$/, "\/.*") + "$";
  90.       }
  91.       var reg = new RegExp(pattern.toLowerCase());
  92.       return (reg.test(url.toLowerCase()));
  93.    },
  94.  
  95.    isMatchFilterList: function(url) {
  96.       var aList = this.getPrefFilterList();
  97.       for (var i=0; i<aList.length; i++) {
  98.          var item = aList[i].split("\b");
  99.          var rule = item[0];
  100.          var enabled = (item.length == 1);
  101.          if (enabled && this.isMatchURL(url, rule)) return(true);
  102.       }
  103.       return(false);
  104.    },
  105.  
  106.    getTopWinBrowser: function() {
  107.       try {
  108.          var winMgr = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  109.          var topWin = winMgr.QueryInterface(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
  110.          var mBrowser = topWin.document.getElementById("content");
  111.          return mBrowser;
  112.       } catch(e) {}
  113.       return null;
  114.    },
  115.  
  116.    autoSwitchFilter: function(url) {
  117.       if (url == "about:blank") return;
  118.       var mBrowser = this.getTopWinBrowser();
  119.       if (!(mBrowser && mBrowser.mIeTabSwitchURL)) return;
  120.       if (mBrowser.mIeTabSwitchURL == url) {
  121.          var isMatched = false;
  122.          var aList = this.getPrefFilterList();
  123.          var isIE = this.isIeTabURL(url);
  124.          if (isIE) url = decodeURI(url.substring(gIeTabChromeStr.length));
  125.          for (var i=0; i<aList.length; i++) {
  126.             var item = aList[i].split("\b");
  127.             var rule = item[0];
  128.             if (this.isMatchURL(url, rule)) {
  129.                aList[i] = rule + (isIE ? "" : "\b");
  130.                isMatched = true;
  131.             }
  132.          }
  133.          if (isMatched) this.setPrefFilterList(aList);
  134.       }
  135.       mBrowser.mIeTabSwitchURL = null;
  136.    }
  137. }
  138.  
  139. // ContentPolicy class
  140. var IeTabWatchFactoryClass = {
  141.   shouldFilter: function(url) {
  142.     return !IeTabWatcher.isIeTabURL(url)
  143.          && IeTabWatcher.isFilterEnabled()
  144.          && IeTabWatcher.isMatchFilterList(url);
  145.   },
  146.   // nsIContentPolicy interface implementation
  147.   shouldLoad: function(contentType, contentLocation, requestOrigin, requestingNode, mimeTypeGuess, extra) {
  148.     if (contentType == Components.interfaces.nsIContentPolicy.TYPE_DOCUMENT) {
  149.       IeTabWatcher.autoSwitchFilter(contentLocation.spec);
  150.       // check IeTab FilterList
  151.       if (this.shouldFilter(contentLocation.spec)) {
  152.         contentLocation.spec = IeTabWatcher.getIeTabURL(contentLocation.spec);
  153.       }
  154.     }
  155.     return (Components.interfaces.nsIContentPolicy.ACCEPT);
  156.   },
  157.   // this is now for urls that directly load media, and meta-refreshes (before activation)
  158.   shouldProcess: function(contentType, contentLocation, requestOrigin, requestingNode, mimeType, extra) {
  159.     return (Components.interfaces.nsIContentPolicy.ACCEPT);
  160.   },
  161.  
  162.   get wrappedJSObject() {
  163.     return this;
  164.   }
  165. }
  166.  
  167. // Factory object
  168. var IeTabWatchFactoryFactory = {
  169.   createInstance: function(outer, iid) {
  170.     if (outer != null) throw Components.results.NS_ERROR_NO_AGGREGATION;
  171.     return IeTabWatchFactoryClass;
  172.   }
  173. }
  174.  
  175. // Module object
  176. var IeTabWatchFactoryModule = {
  177.   registerSelf: function(compMgr, fileSpec, location, type) {
  178.     compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  179.     compMgr.registerFactoryLocation(_IETABWATCH_CID, "IETab content policy", _IETABWATCH_CONTRACTID, fileSpec, location, type);
  180.     var catman = Components.classes["@mozilla.org/categorymanager;1"].getService(Components.interfaces.nsICategoryManager);
  181.     catman.addCategoryEntry("content-policy", _IETABWATCH_CONTRACTID, _IETABWATCH_CONTRACTID, true, true);
  182.   },
  183.  
  184.   unregisterSelf: function(compMgr, fileSpec, location) {
  185.     compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  186.     compMgr.unregisterFactoryLocation(_IETABWATCH_CID, fileSpec);
  187.     var catman = Components.classes["@mozilla.org/categorymanager;1"].getService(Components.interfaces.nsICategoryManager);
  188.     catman.deleteCategoryEntry("content-policy", _IETABWATCH_CONTRACTID, true);
  189.   },
  190.  
  191.   getClassObject: function(compMgr, cid, iid) {
  192.     if (!cid.equals(_IETABWATCH_CID))
  193.       throw Components.results.NS_ERROR_NO_INTERFACE;
  194.  
  195.     if (!iid.equals(Components.interfaces.nsIFactory))
  196.       throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  197.  
  198.     return IeTabWatchFactoryFactory;
  199.   },
  200.  
  201.   canUnload: function(compMgr) {
  202.     return true;
  203.   }
  204. };
  205.  
  206. // module initialisation
  207. function NSGetModule(comMgr, fileSpec) {
  208.   return IeTabWatchFactoryModule;
  209. }
  210.